
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Symbol数据类型</title>
</head>
<body>
    ES6 引入了一种新的原始数据类型Symbol，表示独一无二的值。它是 JavaScript 语言的第七种数据类型
    <!-- 
        ES6 引入了一种新的原始数据类型`Symbol`，用来生成一个唯一值。
            Symbol 值通过Symbol函数生成。
            语法：Symbol();
        应用场景：
            作为对象的属性名，可以保证属性不重名。
        注意事项：
            Symbol 作为对象属性名时不能用 .运算符，要用方括号。
            Symbol 值作为属性名时，该属性是公有属性不是私有属性，可以在类的外部访问。
            但是不会出现在 for...in 、 for...of 的循环中，也不会被 Object.keys() 、 
            Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性，
            可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。
     -->

    <script>

        let s1 = Symbol("张小龙")
        let s2 = Symbol("张小龙")
        let s3 = Symbol("张小龙")

        console.log(s1==s2);
        console.log(s3==s2);

        // 2.应用场景  作为对象的属性名，可以保证属性不重名。
        let obj = {
            id:10,
            name:"张小龙",
            [s1]:"小龙1",
            [s2]:"小龙2",
        }

        console.log(obj);
        
         // 3.注意事项
        // Symbol 作为对象属性名时不能用.运算符，要用方括号。
        // console.log(obj[s1]);
        // console.log(obj[s2]);

        // Symbol 值作为属性名时，该属性是公有属性不是私有属性，可以在类的外部访问。
        // 但是不会出现在 for...in 、 for...of 的循环中，也不会被 Object.keys() 、

        // for (const key in obj) {
        //    console.log(key);
           
        // }
        console.log(Object.keys(obj));
        

        // for of  遍历的是实现iterator接口的对象  -》两类对象   类似数组的对象  可遍历的对象  数组  Set  Map
        // for (const key of obj) {  // obj is not iterable
        //    console.log(key);
           
        // }


        // Object.getOwnPropertyNames() 返回。如果要读取到一个对象的 Symbol 属性，
        //     可以通过 Object.getOwnPropertySymbols() 和 Reflect.ownKeys() 取到。

        console.log(Object.getOwnPropertySymbols(obj));//
        console.log(Object.getOwnPropertyNames(obj));//
        console.log([...Object.getOwnPropertyNames(obj),...Object.getOwnPropertySymbols(obj)]);//
        console.log(Reflect.ownKeys(obj));//
        



    </script>
</body>
</html>